﻿// 603 搭桥.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <cmath>
using namespace std;

/*
http://oj.daimayuan.top/course/14/problem/692
在一片海域上有 n个岛屿，第 i个岛屿的所在位置可以用二维坐标 (xi,yi)
 表示，其中 xi, yi都是整数。

我们想在这些岛屿之间修建桥梁，使得最终所有岛屿两两之间都可以通过桥梁到达。
桥梁只能以岛屿作为起点和终点，桥梁的长度等于起点、终点两个岛屿的欧几里得距离。

由于经费有限，我们想花费最少的代价来修建桥梁（即建造的桥梁的长度和最小）。

请问建造的桥梁的长度和最小为多少？

输入格式
第一行一个整数 n。

接下来 n行，每行两个整数 xi,yi，代表一个岛屿的坐标。

输出格式
输出一行一个数表示建造的桥梁的最小长度和，答案保留一位小数输出。

样例输入
3
0 0
4 4
0 4
样例输出
8.0
数据规模
对于所有数据，保证 2≤n≤800,0≤xi,yi≤1000，两座岛屿不会出现在相同位置。
*/

/*
const int N = 810;
pair<int, int> p[N*2]; int idx;
int f[N];
int m;
struct Edge {
	int a, b;
	double w;
	bool operator <(const struct Edge& W) {
		return w < W.w;
	}
}edges[N*N];
int n;

int find(int x) {
	if (x != f[x]) f[x] = find(f[x]);

	return f[x];
}

double kruskal() {
	sort(edges, edges + m);
	for (int i = 1; i <= n; i++) f[i] = i;
	double res = 0.0; int cnt = 0;

	for (int i = 0; i < 2*m; i++) {
		int a = edges[i].a, b = edges[i].b;double w = edges[i].w;

		a = find(a), b = find(b);
		if (a != b)    
		{
			f[a] = b;
			res += (w);
			cnt++;
		}
	}

	return res;
}

int main()
{
	cin >> n;

	for (int i = 0; i < n; i++) {
		int x, y; cin >> x >> y;
		p[i].first = x; p[i].second = y;
	}

	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			int a = i + 1; int b = j + 1; double w = sqrt((p[a].first - p[b].first) * (p[a].first - p[b].first)
				+ (p[a].second - p[b].second) * (p[a].second - p[b].second));
			edges[m].a = a; edges[m].b = b; edges[m].w = w; m++;
			edges[m].b = a; edges[m].a = b; edges[m].w = w; m++;
		}
	}

	printf("%.1f\n", kruskal()) ;


	return 0;
}
*/




struct Node {
	int y, v;
	Node(int _y, int _v) { y = _y; v = _v; }
};
int n, a[801][2];
double f[801][801], dist[801];
bool b[50001];

void  prim() {
	memset(b, false, sizeof b);
	for (int i = 1; i <= n; i++)
		dist[i] = 1e99;
	dist[1] = 0;
	double ans = 0;
	for (int i = 1; i <= n; i++) {
		int x = -1;
		for (int j = 1; j <= n; j++) {
			if (!b[j] && dist[j] < 1e99)
				if (x == -1 || dist[j] < dist[x])
					x = j;
		}
		b[x] = true;
		ans += dist[x];
		for (int j = 1; j <= n; j++) {
			dist[j] = min(dist[j], f[x][j]);
		}
	}

	printf("%.1f",ans);
}

int main() {
	scanf("%d",&n);
	for (int i = 1; i <= n; i++)
		scanf("%d%d",&a[i][0],&a[i][1]);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			f[i][j] = sqrt((a[i][0] - a[j][0]) * (a[i][0] - a[j][0]) +
			(a[i][1] - a[j][1]) * (a[i][1] - a[j][1]));

	prim();
}
